﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace Itegracion.Framework.Forms
{
    public partial class fmMantenimiento : fmProceso
    {
        protected bool tieneDetalle = false;
        protected ucEdicion propiedades;

        public fmMantenimiento()
        {
            InitializeComponent();
        }

        #region Metodos
        protected virtual void OnAddFields(DataGridView listado, ref ucEdicion propiedades)
        {
            MessageBox.Show("Mantenimiento: OnAddFields()");
        }

        protected virtual void OnLoadData(DataGridView listado)
        {
            MessageBox.Show("Mantenimiento: OnLoadData()");
        }
        #endregion

        #region Propiedades
        private ModoMantenimiento modo;
        public ModoMantenimiento Modo { 
            get{
                return modo;
            }
            set{
                modo = value;
                if (modo == ModoMantenimiento.Listado)
                {
                    paEdicion.Visible = false;
                    paListado.Visible = true;
                    tsbNuevo.Enabled = true;
                    tsbEditar.Enabled = false;
                    tsbEliminar.Enabled = !tieneDetalle;
                    tsbGuardar.Enabled = false;
                    tsbGuardarContinuar.Enabled = false;
                    tsbImprimir.Enabled = false;
                    tsbCancelar.Enabled = false;
                    slBuscar.Enabled = true;
                    stbClave.Enabled = true;
                    tssDetalle.Visible = false;
                    tsbAgregar.Visible = false;
                    tsbQuitar.Visible = false;
                    dgvListado.Focus();
                }
                if (modo == ModoMantenimiento.Propiedades)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbNuevo.Enabled = true;
                    tsbEditar.Enabled = true;
                    tsbEliminar.Enabled = propiedades.Activo();
                    tsbGuardar.Enabled = false;
                    tsbGuardarContinuar.Enabled = false;
                    tsbImprimir.Enabled = true;
                    tsbCancelar.Enabled = true;
                    slBuscar.Enabled = false;
                    stbClave.Enabled = false;
                    tssDetalle.Visible = tieneDetalle;
                    tsbAgregar.Visible = tieneDetalle;
                    tsbQuitar.Visible = tieneDetalle;
                    tsbAgregar.Enabled = false;
                    tsbQuitar.Enabled = false;
                    propiedades.Focus();
                }
                if (modo == ModoMantenimiento.Edicion)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbNuevo.Enabled = true;
                    tsbEditar.Enabled = false;
                    tsbEliminar.Enabled = false;
                    tsbGuardar.Enabled = true;
                    tsbGuardarContinuar.Enabled = false;
                    tsbImprimir.Enabled = false;
                    tsbCancelar.Enabled = true;
                    slBuscar.Enabled = false;
                    stbClave.Enabled = false;
                    tssDetalle.Visible = tieneDetalle;
                    tsbAgregar.Visible = tieneDetalle;
                    tsbQuitar.Visible = tieneDetalle;
                    tsbAgregar.Enabled = true;
                    tsbQuitar.Enabled = true;
                    propiedades.Focus();
                }
                if (modo == ModoMantenimiento.Nuevo)
                {
                    paEdicion.Visible = true;
                    paListado.Visible = false;
                    tsbNuevo.Enabled = false;
                    tsbEditar.Enabled = false;
                    tsbEliminar.Enabled = false;
                    tsbGuardar.Enabled = true;
                    tsbGuardarContinuar.Enabled = true;
                    tsbImprimir.Enabled = false;
                    tsbCancelar.Enabled = true;
                    slBuscar.Enabled = false;
                    stbClave.Enabled = false;
                    tssDetalle.Visible = tieneDetalle;
                    tsbAgregar.Visible = tieneDetalle;
                    tsbQuitar.Visible = tieneDetalle;
                    tsbAgregar.Enabled = true;
                    tsbQuitar.Enabled = true;
                    propiedades.Focus();
                }
            }
        }
        #endregion

        #region Eventos
        private void fmMantenimiento_Load(object sender, EventArgs e)
        {
            propiedades = new ucEdicion();
            paEdicion.Dock = DockStyle.Fill;
            paListado.Dock = DockStyle.Fill;
            Modo = ModoMantenimiento.Listado;
            if (Process.GetCurrentProcess().ProcessName != "devenv") //#Hack: Problema de visualizacion en Tipo de Diseño
            {
                OnAddFields(dgvListado, ref propiedades);
                propiedades.Configuration = this.Configuration;
                dgvListado.AutoGenerateColumns = false;
                OnLoadData(dgvListado);
                propiedades.OnLoadData();
            }
            paEdicion.Controls.Add(propiedades);
            propiedades.Dock = DockStyle.Fill;
        }

        private void tsbNuevo_Click(object sender, EventArgs e)
        {
            propiedades.Clear();
            propiedades.OnNew();
            propiedades.Enable();
            Modo = ModoMantenimiento.Nuevo;
            propiedades.Focus();
        }
        private void tsbEditar_Click(object sender, EventArgs e)
        {
            propiedades.Enable();
            Modo = ModoMantenimiento.Edicion;
            propiedades.Focus();
        }

        private void tsbCancelar_Click(object sender, EventArgs e)
        {
            if(modo == ModoMantenimiento.Propiedades)
                Modo = ModoMantenimiento.Listado;
            if (modo == ModoMantenimiento.Edicion || modo == ModoMantenimiento.Nuevo)
                if (MessageBox.Show(this, "No se guardarán los cambios realizados. ¿Desea Continuar?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    Modo = ModoMantenimiento.Listado;
                }
        }

        private void tsbGuardar_Click(object sender, EventArgs e)
        {
            propiedades.ep.Clear();
            object id = null;
            if (Modo == ModoMantenimiento.Edicion)
                id = dgvListado.SelectedRows[0].Cells[0].Value;  
            
            if (propiedades.AreDataValid(Modo))
            {   
                propiedades.OnSave(id, Modo);
                Modo = ModoMantenimiento.Listado;
                OnLoadData(dgvListado);
            }
        }
        private void tsbGuardarContinuar_Click(object sender, EventArgs e)
        {
            propiedades.ep.Clear();
            object id = null;
            if (Modo == ModoMantenimiento.Edicion)
                id = dgvListado.SelectedRows[0].Cells[0].Value;

            if (propiedades.AreDataValid(Modo))
            {
                propiedades.OnSave(id, Modo);
                Modo = ModoMantenimiento.Nuevo;
                OnLoadData(dgvListado);
                propiedades.Clear();
                propiedades.OnNew(); 
            }
        }        

        private void tsbEliminar_Click(object sender, EventArgs e)
        {   
            if (dgvListado.SelectedRows.Count > 0)
            {
                if (MessageBox.Show(this, "Se eliminar el registro seleccionado. \n ¿Desea continuar?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    propiedades.OnDelete(dgvListado.SelectedRows[0].Cells[0].Value + "", dgvListado.SelectedRows[0].Cells[0]);
                    Modo = ModoMantenimiento.Listado;
                    OnLoadData(dgvListado);
                }
            }
            else {
                MessageBox.Show(this, "No hay registros seleccionados", "Itegracion", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void tsbImprimir_Click(object sender, EventArgs e)
        {
            propiedades.OnPrint();
        }
        private void tsbAgregar_Click(object sender, EventArgs e)
        {
            if(tieneDetalle && Modo != ModoMantenimiento.Listado)
                propiedades.OnAddItem();
        }
        private void tsbQuitar_Click(object sender, EventArgs e)
        {
            if (tieneDetalle && Modo != ModoMantenimiento.Listado)
                propiedades.OnRemoveItem();
        }

        private void stbClave_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                MessageBox.Show("Filtrando");
            }
        }

        private void dgvListado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvListado.Rows.Count > 0)
            {
                propiedades.OnProperty(dgvListado.SelectedRows[0].Cells[0].Value + "", dgvListado.SelectedRows[0].Cells[0]);
                propiedades.Disable();
                Modo = ModoMantenimiento.Propiedades;
            }
        }

        private void fmMantenimiento_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.N && e.Modifiers == Keys.Control && tsbNuevo.Enabled)
            {
                tsbNuevo_Click(sender, e);
            }
            if (e.KeyCode == Keys.F2 && tsbEditar.Visible && tsbEditar.Enabled)
            {
                tsbEditar_Click(sender, e);
            }
            if (e.KeyCode == Keys.B && e.Modifiers == Keys.Control && tsbAgregar.Visible && tsbAgregar.Enabled)
            {
                tsbAgregar_Click(sender, e);
            }
            if (e.KeyCode == Keys.P && e.Modifiers == Keys.Control && tsbImprimir.Enabled)
            {
                tsbImprimir_Click(sender, e);
            }
            if (e.KeyCode == Keys.G && e.Modifiers == Keys.Control && tsbGuardar.Enabled)
            {
                tsbGuardar_Click(sender, e);
            }
            if (e.KeyCode == Keys.H && e.Modifiers == Keys.Control && tsbGuardarContinuar.Enabled)
            {
                tsbGuardarContinuar_Click(sender, e);
            }
            if (e.KeyCode == Keys.Escape && tsbCancelar.Enabled)
            {
                tsbCancelar_Click(sender, e);
            }
            if (e.KeyCode == Keys.D && e.Modifiers == Keys.Control && tsbEliminar.Enabled)
            {
                tsbEliminar_Click(sender, e);
            }
            //if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down && modo == ModoMantenimiento.Listado)
            //{
            //    dgvListado.Focus();
            //}
        }

        private void dgvListado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                e.SuppressKeyPress = true;
        }

        private void dgvListado_KeyUp(object sender, KeyEventArgs e)
        {   
            if (dgvListado.Rows.Count > 0 && e.KeyCode == Keys.Enter && modo == ModoMantenimiento.Listado)
            {
                propiedades.OnProperty(dgvListado.SelectedRows[0].Cells[0].Value + "", dgvListado.SelectedRows[0].Cells[0]);
                propiedades.Disable();
                Modo = ModoMantenimiento.Propiedades;
            }
        }
        #endregion
    }

    public enum ModoMantenimiento { 
        Listado, Edicion, Nuevo, Propiedades
    }
}
